package com.jinqing.wuchuang.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jinqing.wuchuang.controller.HelloController;
import com.jinqing.wuchuang.entity.FdfsFile;
import com.jinqing.wuchuang.entity.SettledTeamMenber;
import com.jinqing.wuchuang.entity.WordFile;
import com.jinqing.wuchuang.mapper.FdfsFileMapper;
import com.jinqing.wuchuang.mapper.WordFileMapper;
import com.jinqing.wuchuang.service.FileService;
import com.jinqing.wuchuang.utils.FastDFSUtil;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;


import java.io.IOException;
import java.util.List;

@Service
public class FileServiceImpl implements FileService {
    private final static org.slf4j.Logger logger= LoggerFactory.getLogger(FileServiceImpl.class);
    @Autowired
    private WordFileMapper wordFileMapper;
    @Autowired
    FdfsFileMapper fdfsFileMapper;


    @Override
    @Transactional(isolation = Isolation.READ_COMMITTED)
    public String wordURL(MultipartFile file,Long uid,int companyId) throws IOException{
        //获取文件对应的字节数组
        byte[] buffFile=file.getBytes();
        //获取文件名
        String fileName=file.getOriginalFilename();
        //获取文件大小
        Long fileSize=file.getSize();
        //获取文件类型
        String fileType=file.getContentType();
        //可能会出现问题因为有些文件可能没有扩展名，因此必要时需要做逻辑控制
        String fileExtName=fileName.substring(fileName.lastIndexOf(".")+1);
        //查询之前是否有下载过文件
        QueryWrapper<WordFile> fileQueryWrapper = new QueryWrapper<>();
        fileQueryWrapper.eq("uid",uid).eq("company_id",companyId);
        WordFile wordFile = wordFileMapper.selectOne(fileQueryWrapper);
        //如果有，删除记录
        if(null != wordFile){
            //删除服务器上保存的文件
            int result = FastDFSUtil.delete(wordFile.getGroupName(),wordFile.getRemoteFilename());
            //删除数据库记录
            if (result == 0){
                wordFileMapper.deleteById(wordFile.getId());
            }else {
                return "error";
            }

        }
        //上传文件
        String[] uploadResult= FastDFSUtil.upload(buffFile,fileExtName);
        //把文件信息保存到数据库，以后下载文件就从数据库获取到文件路径再下载
        WordFile wFile = new WordFile();
        wFile.setGroupName(uploadResult[0]);
        wFile.setRemoteFilename(uploadResult[1]);
        wFile.setOldFilename(fileName);
        wFile.setFileSize(fileSize);
        wFile.setFileType(fileType);
        wFile.setUid(uid);
        wFile.setCompanyId(companyId);
        //保存信息到数据库
        logger.info(wFile.toString());
        wordFileMapper.insert(wFile);
        String url = "http://47.102.99.215/"+wFile.getGroupName()+"/"+wFile.getRemoteFilename();
        return url;
    }

    @Override
    public String uploadFile(MultipartFile file) throws IOException {
        //获取文件对应的字节数组
        byte[] buffFile=file.getBytes();
        //获取文件名
        String fileName=file.getOriginalFilename();
        //获取文件大小
        Long fileSize=file.getSize();
        //获取文件类型
        String fileType=file.getContentType();
        //可能会出现问题因为有些文件可能没有扩展名，因此必要时需要做逻辑控制
        String fileExtName=fileName.substring(fileName.lastIndexOf(".")+1);
        //上传文件
        String[] uploadResult= FastDFSUtil.upload(buffFile,fileExtName);
        //把文件信息保存到数据库，以后下载文件就从数据库获取到文件路径再下载
        FdfsFile fdfsFile = new FdfsFile();
        fdfsFile.setGroupName(uploadResult[0]);
        fdfsFile.setRemoteFilename(uploadResult[1]);
        fdfsFile.setOldFilename(fileName);
        fdfsFile.setFileSize(fileSize);
        fdfsFile.setFileType(fileType);
        int insertResult = fdfsFileMapper.insertSelective(fdfsFile);
        String message = insertResult != 0 ? "上传成功" : "上传失败";
        return message;
    }

    @Override
    public String deleteFile(FdfsFile file) {
        int deleteFromDatabase = 0;
        String deleteResult;
        //删除服务器上的文件
        int deleteFromService = FastDFSUtil.delete(file.getGroupName(),file.getRemoteFilename());
        if (deleteFromService == 0 ){
            //删除数据库的记录
            deleteFromDatabase = fdfsFileMapper.deleteByPrimaryKey(file.getId());
        }
        deleteResult = deleteFromDatabase != 0 ? "删除成功" : "删除失败";
        return deleteResult;
    }
}
